import React, { createContext, useState, useEffect, useContext } from 'react';
import keycloak from '../config/keycloak';

// 创建Keycloak上下文
const KeycloakContext = createContext(null);

// 添加全局初始化标志，防止重复初始化
let keycloakInitialized = false;



// Keycloak提供者组件
export const KeycloakProvider = ({ children }) => {
  const [isAuthenticated, setIsAuthenticated] = useState(false);
  const [userProfile, setUserProfile] = useState(null);
  const [isLoading, setIsLoading] = useState(true);
  const [token, setToken] = useState(null);



  // 初始化Keycloak
  useEffect(() => {
    const initKeycloak = async () => {
      // 检查是否已初始化，避免重复初始化
      if (keycloakInitialized) {
        console.log('Keycloak 已经初始化过，跳过重复初始化');
        setIsAuthenticated(keycloak.authenticated);
        setIsLoading(false);
        if (keycloak.authenticated) {
          try {
            const profile = await keycloak.loadUserProfile();
            setUserProfile(profile);
            setToken(keycloak.token);
          } catch (error) {
            console.error('加载用户信息失败:', error);
          }
        }
        return;
      }
      
      try {
        console.log('开始初始化 Keycloak...1111');
        // 初始化Keycloak
        const authenticated = await keycloak.init({
          onLoad: 'login-required', // 直接要求登录
          redirectUri: window.location.origin, // 使用基础URL作为重定向地址
          silentCheckSsoRedirectUri: window.location.origin + '/silent-check-sso.html',
          pkceMethod: 'S256', // 使用PKCE增强安全性
          enableLogging: true, // 启用日志记录
          checkLoginIframe: false // 在某些环境中可能需要禁用
        });

        // 标记为已初始化
        keycloakInitialized = true;
        console.log('Keycloak 初始化成功');
        
        setIsAuthenticated(authenticated);

        if (authenticated) {
          // 获取用户信息
          const profile = await keycloak.loadUserProfile();
          setUserProfile(profile);
          setToken(keycloak.token);
          


          // 设置token刷新
          setInterval(() => {
            keycloak.updateToken(70).then((refreshed) => {
              if (refreshed) {
                setToken(keycloak.token);
                console.log('Token refreshed');
              }
            }).catch(() => {
              console.error('Failed to refresh token');
              // 如果刷新失败，重新登录
              keycloak.login();
            });
          }, 60000); // 每60秒检查一次
        }
      } catch (error) {
        console.error('Keycloak initialization error:', error);
      } finally {
        setIsLoading(false);
      }
    };

    initKeycloak();
  }, []);

  // 登录方法
  const login = () => {
    keycloak.login();
  };

  // 登出方法 - 调用 Keycloak 的登出方法
  const logout = () => {
    // 使用 Keycloak 的 logout 方法，并指定登出后重定向到登录页面
    keycloak.logout({
      redirectUri: `${window.location.origin}/login?force_login=true`
    });
  };

  // 检查用户是否有特定角色
  const hasRole = (roles) => {
    return Array.isArray(roles)
      ? roles.some(role => keycloak.hasRealmRole(role))
      : keycloak.hasRealmRole(roles);
  };

  // 提供上下文值
  const contextValue = {
    keycloak,
    isAuthenticated,
    userProfile,
    isLoading,
    token,
    login,
    logout,
    hasRole
  };

  return (
    <KeycloakContext.Provider value={contextValue}>
      {children}
    </KeycloakContext.Provider>
  );
};

// 自定义Hook，方便在组件中使用Keycloak
export const useKeycloak = () => {
  const context = useContext(KeycloakContext);
  if (!context) {
    throw new Error('useKeycloak must be used within a KeycloakProvider');
  }
  return context;
};
